package com.atguigu.crowd.mvc.handler;

import com.atguigu.crowd.entity.Menu;
import com.atguigu.crowd.service.api.MenuService;
import com.atguigu.crowd.util.ResultEntity;
import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


//@Controller
@RestController
public class MenuHandler {

    @Autowired
    private MenuService menuService;


    /**
     * 菜单维护页  删除
     * @param id
     * @return
     */
//    @ResponseBody
    @RequestMapping("/menu/remove.json")
    public ResultEntity<String> removeMenu(@RequestParam ("id") Integer id){
        menuService.removeMenu(id);
        return ResultEntity.successWithoutData();
    }

    /**
     * 菜单维护页  更新
     * @param menu
     * @return
     */
//    @ResponseBody
    @RequestMapping("/menu/update.json")
    public ResultEntity<String> updateMenu(Menu menu){

        menuService.updateMenu(menu);

        return ResultEntity.successWithoutData();
    }


    /**
     * 菜单维护页 新增
     * @return
     */
//    @ResponseBody
    @RequestMapping("/menu/save.json")
    public ResultEntity<String> saveMenu(Menu menu){

        menuService.saveMenu(menu);

        return ResultEntity.successWithoutData();
    }

    /**
     * 菜单维护页    遍历节点 创建树
     * @return
     */
//    @ResponseBody
    @RequestMapping("/menu/get/whole/tree.json")
    public ResultEntity<Menu> getWholeTree(){

        //从数据库获取所有menu对象
        List<Menu> menuList = menuService.getAll();

        //声明一个变量为父节点
        Menu root=null;

        //创建 Map 对象用来存储 id 和 Menu 对象的对应关系便于查找父节点
        Map<Integer,Menu> menuMap= new HashMap<>();

        //遍历menuList填充map
        for (Menu m: menuList) {
            Integer id=m.getId();
            menuMap.put(id,m);
        }

        //再次遍历 menuList 查找根节点、组装父子节点
        for (Menu menu:menuList) {
            Integer pid=menu.getPid();

            //如果 pid 为 null，判定为根节点
            if(pid == null){
                //父节点为空 则是根节点
                root=menu;

                //8.如果当前节点是根节点，那么肯定没有父节点，不必继续执行
                continue;
            }

            //9.如果 pid 不为 null，说明当前节点有父节点，那么可以根据 pid 到 menuMap 中 查找对应的 Menu 对象
            Menu father=menuMap.get(pid);

            //给父节点添加子结点
            father.getChildren().add(menu);
        }

        //11.经过上面的运算，根节点包含了整个树形结构，返回根节点就是返回整个树
        return ResultEntity.successWithData(root);
    }
}
